#ifndef _SRC_NET_SOCKET_H_
#define _SRC_NET_SOCKET_H_
#include "src/base/utils.h"

#include <string>
#include <optional>

struct tcp_info;

namespace fio66::net {
class InetAddress;

class Socket {
  DISALLOW_COPY_AND_ASSIGN(Socket);

 public:
  explicit Socket(const int sock_fd);
  ~Socket();
  // 返回文件描述符
  int Fd() const;
  // 获取tcp_info信息
  bool GetTcpInfo(struct tcp_info*) const;
  // 将tcp_info转为字符串，主要供log输出
  bool GetTcpInfoString(char* buf, const int len) const;
  std::optional<std::string> GetTcpInfoString() const;
  // 对bind函数的封装，将socket绑定到本地地址中，如果绑定失败则退出程序
  void BindAddress(const InetAddress& local_addr);
  // 对listen的封装
  void Listen();
  // 对accept的封装
  int Accept(InetAddress* peer_addr);
  // 对shutdown函数的封装，
  void ShutDownWrite();
  // 关于SOCKET设置的封装
  void SetTcpNoDelay(const bool on);
  void SetReuseAddr(const bool on);
  void SetReusePort(const bool on);
  void SetKeepAlive(const bool on);

 private:
  const int sock_fd_;
};

}  // namespace fio66::net

#endif  // _SRC_NET_SOCKET_H_
